home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 June
/
EnigmA AMIGA RUN 08 (1996)(G.R. Edizioni)(IT)[!][issue 1996-06][EARSAN CD VII].iso
/
earcd
/
cmdity
/
clicker.lha
/
Clicker
/
Source
/
gui.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-05-17
|
8KB
|
264 lines
/* File: gui.c
* Created: 20-10-95
* Updated: 17-05-96
* Version: 1.3
* Project: Clicker
* Owner: Jeroen Vermeulen
* Requirements: KickStart V39+
* Legal: PD
* Status: Release
*/
#include <proto/exec.h>
#include <exec/memory.h>
#include <proto/graphics.h>
#include <proto/intuition.h>
#include <proto/gadtools.h>
#include <intuition/gadgetclass.h>
#include "gui.h"
#include "sound.h"
#include "prefs.h"
static STRPTR
AllocFailWindow = "Couldn't allocate memory for prefs window!\n",
OpenFailWindow = "Couldn't open prefs window!\n",
LockFailPubScr = "Couldn't lock public screen\n",
GetFailVisInfo = "Couldn't get VisualInfo for screen\n",
AllocFailGadget = "Unable to create gadgets for prefs window!\n";
/* Topaz-sensitive TextAttr structure.
* The catchphrase "Topaz-sensitive" is a trademark of Hans Guijt International
*/
static struct TextAttr Topaz80 = { "topaz.font", 8, 0, 0 };
/* Constant GUI tags
*/
static const struct TagItem StaticFrequencyTags[] =
{
{GTSL_Min, -5*12},
{GTSL_Max, 4*12},
{GTSL_LevelFormat, (ULONG)"%4ld"},
{GTSL_LevelPlace, PLACETEXT_RIGHT},
{GTSL_DispFunc, (ULONG)SliderToHertz},
{GTSL_MaxLevelLen, 4},
{GA_Immediate, TRUE},
{TAG_END, NULL}
},
StaticVolumeTags[] =
{
{GTSL_Max, 64},
{GTSL_LevelFormat, (ULONG)"%2ld"},
{GTSL_LevelPlace, PLACETEXT_RIGHT},
{GTSL_MaxLevelLen, 4},
{GA_Immediate, TRUE},
{TAG_END, NULL}
},
StaticCycleTags[] =
{
{GTSL_Min, 1},
{GTSL_Max, 20},
{GTSL_LevelFormat, (ULONG)"%2ld"},
{GTSL_LevelPlace, PLACETEXT_RIGHT},
{GTSL_MaxLevelLen, 4},
{GA_Immediate, TRUE},
{TAG_END, NULL}
},
StaticPrefsWindowTags[] =
{
{WA_Width, 250},
{WA_Height, 100},
{WA_Title, (ULONG)"Clicker Prefs"},
{WA_Flags, WFLG_DRAGBAR | WFLG_DEPTHGADGET |
WFLG_CLOSEGADGET | WFLG_SMART_REFRESH |
WFLG_ACTIVATE | WFLG_NEWLOOKMENUS},
{WA_IDCMP, SLIDERIDCMP | CHECKBOXIDCMP | BUTTONIDCMP |
IDCMP_CLOSEWINDOW | IDCMP_REFRESHWINDOW},
{TAG_END, NULL}
};
/* MakeWindow():
* Sets up the prefs window, but doesn't show it unless the Show argument is
* TRUE. If successful, MakeWindow() returns a pointer to a WindowContext
* structure. If not, NULL is returned and the STRPTR pointed to by errptr will
* point to an error string.
* The window must later be deallocated with DestroyWindow().
*/
struct WindowContext *MakeWindow(STRPTR *const errptr, const BOOL Show)
{
struct WindowContext *WinStruct;
/* --- */
if ((WinStruct = AllocMem(sizeof(struct WindowContext),MEMF_ANY|MEMF_CLEAR)))
{
if (Show) ShowWindow(errptr,WinStruct);
}
else *errptr = AllocFailWindow;
return WinStruct;
}
/* ShowWindow():
* Reveal prefs window, setting it up first if necessary. A non-NULL pointer to
* its WindowContext structure is passed in as an argument.
* If the window fails to open, errptr will point to an error string.
*/
void ShowWindow(STRPTR *const errptr, struct WindowContext *const WinStruct)
{
if (!WinStruct->Shown)
{
struct Screen *pubscr;
if (!(WinStruct->pubscr = pubscr = LockPubScreen(NULL)))
{
*errptr = LockFailPubScr;
return;
}
if ((WinStruct->visinfo = GetVisualInfoA(pubscr,NULL)))
{
struct Gadget *gad;
/* --- */
if ((gad = CreateContext(&WinStruct->glist)))
{
struct TagItem ClickMouseTags[] =
{
{GTCB_Checked, FALSE}, /* Set to ClickPrefs.ClickMouse later! */
#ifdef NOCLICKMOUSE
{GA_Disabled, TRUE}, /* Mouse click permanently disabled */
#endif /* NOCLICKMOUSE */
{TAG_END, NULL}
};
struct NewGadget gadget =
{
10, 0, 26, 11,
"Click Mouse button",
&Topaz80,
mygadget_clickmouse,
PLACETEXT_RIGHT,
NULL,
NULL
};
/* --- */
gadget.ng_TopEdge = 12 + pubscr->WBorTop + pubscr->Font->ta_YSize+1;
gadget.ng_VisualInfo = WinStruct->visinfo;
#ifndef NOCLICKMOUSE
ClickMouseTags[0].ti_Data = ClickPrefs.ClickMouse;
#endif /* NOCLICKMOUSE */
gad = CreateGadgetA(CHECKBOX_KIND, gad, &gadget,ClickMouseTags);
gadget.ng_Width = 100;
gadget.ng_LeftEdge = 90;
gadget.ng_Flags = 0;
gadget.ng_TopEdge += 12;
gadget.ng_GadgetText = "Pitch";
gadget.ng_GadgetID = mygadget_period;
/* The gadget is supposed to show frequency in Hz, but the actual slider
* positions are logarithmic. Hitting the A at 440 Hz is the hard one.
* A 12-tone scale over 9 octaves is used; frequency can be determined
* from the slider position by the formula
*
* Freq = 440 * 2^(n/12)
*
* It thus ranges from the A at 13.75 Hz to the one at 7040 Hz. This
* conversion is performed by SliderToHertz().
*/
gad = CreateGadget(SLIDER_KIND, gad, &gadget,
GTSL_Level, PeriodToSlider(ClickPrefs.period),
TAG_MORE, (ULONG)StaticFrequencyTags);
gadget.ng_TopEdge += 12;
gadget.ng_GadgetText = "Volume";
gadget.ng_GadgetID = mygadget_volume;
gad = CreateGadget(SLIDER_KIND, gad, &gadget,
GTSL_Level, ClickPrefs.volume,
TAG_MORE, (ULONG)StaticVolumeTags);
gadget.ng_TopEdge += 12;
gadget.ng_GadgetText = "Length";
gadget.ng_GadgetID = mygadget_cycles;
gad = CreateGadget(SLIDER_KIND, gad, &gadget,
GTSL_Level, ClickPrefs.cycles,
TAG_MORE, (ULONG)StaticCycleTags);
if (gad)
{
WinStruct->Win = OpenWindowTags(NULL,
WA_Gadgets, (ULONG)WinStruct->glist,
TAG_MORE, (ULONG)StaticPrefsWindowTags);
if (WinStruct->Win)
{
WinStruct->SigMask = 1L<<(WinStruct->Win->UserPort->mp_SigBit);
WinStruct->Shown = TRUE;
GT_RefreshWindow(WinStruct->Win,NULL);
}
else
{
FreeGadgets(gad);
gad = WinStruct->glist = NULL;
*errptr = OpenFailWindow;
}
}
else *errptr = AllocFailGadget;
}
if (!gad)
{
FreeVisualInfo(WinStruct->visinfo);
WinStruct->visinfo = NULL;
}
}
else *errptr = GetFailVisInfo;
if (!WinStruct->visinfo)
{
UnlockPubScreen(NULL,pubscr);
WinStruct->pubscr = NULL;
}
}
}
/* HideWindow():
* Removes the prefs window from the screen, but may keep its structures around
* for speed and convenience.
*/
void HideWindow(struct WindowContext *const WinStruct)
{
if (WinStruct && WinStruct->Shown)
{
CloseWindow(WinStruct->Win);
FreeGadgets(WinStruct->glist);
FreeVisualInfo(WinStruct->visinfo);
UnlockPubScreen(NULL,WinStruct->pubscr);
WinStruct->Shown = FALSE;
WinStruct->SigMask = 0;
WinStruct->visinfo = NULL;
WinStruct->glist = NULL;
WinStruct->pubscr = NULL;
}
}
/* DestroyWindow():
* Call this to deallocate the prefs window. It will be closed first if
* necessary.
*/
void DestroyWindow(struct WindowContext *const WinStruct)
{
HideWindow(WinStruct);
/* MEMORY LEAK FIXED: Forgot to FreeMem() the WinStruct! */
if (WinStruct) FreeMem(WinStruct,sizeof(struct WindowContext));
}